#include "admin.h"
#include "ui_admin.h"
#include "mysqlserver.h"
#include <QMessageBox>
#include "loginset.h"
#include <QComboBox>
#include <QStyledItemDelegate>
#include <QSqlRecord>
#include <QListWidget>
#include <QModelIndexList>
#include <QItemSelectionModel>  // 用于处理项目选择模型
#include <QModelIndexList>      // 用于处理模型索引列表
#include <QListWidget>          // 用于创建可勾选的列表控件
#include <QVBoxLayout>          // 用于创建垂直布局
#include <QDialog>              // 用于创建对话框
#include <QPushButton>          // 用于创建按钮
#include <QMessageBox>          // 用于显示消息框

QSqlError error;
bool flag = false;

admin::admin(QString name, QString pass, QString SERVER, QString port,QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::admin)
{
    ui->setupUi(this);
    this->name = name;
    this->pass = pass;
    mysql.SERVER = SERVER;
    mysql.PORT = port;

    if(!mysql.connectMysql())
    {
        qDebug() << "数据库连接失败" << mysql.db.lastError().text();
        QMessageBox::critical(this,"连接失败","数据库连接失败，请检查IP和端口号是否正确");
    }

    // 创建模型
    userModel = new QSqlTableModel(this, mysql.db);
    memberModel = new QSqlTableModel(this, mysql.db);
    kdcModel = new QSqlTableModel(this, mysql.db);
    maintainModel = new QSqlTableModel(this, mysql.db);
    // 设置列宽拉伸填充表格
    ui->userTableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
    ui->memberTableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
    ui->maintainTableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
    ui->kdcTableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);

    // 设置为不可编辑
    ui->kdcTableView->setEditTriggers(QAbstractItemView::NoEditTriggers);
    ui->userTableView->setEditTriggers(QAbstractItemView::NoEditTriggers);
    ui->memberTableView->setEditTriggers(QAbstractItemView::NoEditTriggers);
    ui->maintainTableView->setEditTriggers(QAbstractItemView::NoEditTriggers);
}

admin::~admin()
{
    delete ui;
    delete userModel;
    delete memberModel;
    delete kdcModel;
    delete maintainModel;
}

// 页面切换
void admin::on_admintoolBox_currentChanged(int index)
{
    ui->featPage->setCurrentIndex(index);

}

// 用户查询
void admin::on_userSelect_clicked()
{
    SQL = "SELECT uname AS 用户名,CASE WHEN perm = 1 THEN '管理员'WHEN perm = 2 THEN '用户'WHEN perm = 3 THEN '维修员'END AS 用户身份 FROM USER;";
    qDebug() << mysql.SERVER;
    qDebug() << mysql.PORT;

    userModel->setQuery(SQL, mysql.db);


    error = userModel->lastError();
    if (error.type() != QSqlError::NoError) {
        qDebug() << "查询执行失败，错误信息: " << error.text();
        QMessageBox::critical(this,"连接失败","数据库连接失败，请检查ip地址和端口号");
    }

    // 将模型设置给userTableView
    ui->userTableView->setModel(userModel);
}

// 会员查询
void admin::on_memberSelect_clicked()
{
    SQL = "select client_name as 用户名, client_contact as 联系方式, client_booking as 预约编号, client_grade as 会员等级, client_balance as 账户余额 FROM member_info;";
    memberModel->setQuery(SQL, mysql.db);

    error = memberModel->lastError();
    if (error.type() != QSqlError::NoError) {
        qDebug() << "查询执行失败，错误信息: " << error.text();
        QMessageBox::critical(this,"连接失败","数据库连接失败，请检查ip地址和端口号");
    }

    // 将模型设置给userTableView
    ui->memberTableView->setModel(memberModel);
}

// 维修员查询
void admin::on_maintaninSelect_clicked()
{
    SQL = "select maintain_name as 用户名,maintain_contact as 联系方式,maintain_num as 任务数量 FROM maintain_info;";
    maintainModel->setQuery(SQL, mysql.db);

    error = maintainModel->lastError();
    if (error.type() != QSqlError::NoError) {
        qDebug() << "查询执行失败，错误信息: " << error.text();
        QMessageBox::critical(this,"连接失败","数据库连接失败，请检查ip地址和端口号");
    }

    // 将模型设置给userTableView
    ui->maintainTableView->setModel(maintainModel);
}

// 卡丁车查询
void admin::on_kdcSelect_clicked()
{
    SQL = "select"
    " `kdc_id` as 卡丁车编号,"
    " `kdc_color` as 颜色, "
    " `kdc_type` as 类型,"
    " `kdc_booking` as 使用状态,"
    " `kdc_state` as 类型,"
    " `kdc_exclusive` as 是否专属"
    " FROM kdc_info;";

    kdcModel->setQuery(SQL, mysql.db);

    error = kdcModel->lastError();
    if (error.type() != QSqlError::NoError) {
        qDebug() << "查询执行失败，错误信息: " << error.text();
        QMessageBox::critical(this,"连接失败","数据库连接失败，请检查ip地址和端口号");
    }

    // 将模型设置给userTableView
    ui->kdcTableView->setModel(kdcModel);
}

// 管理员设置页面
void admin::on_adminSetSql_clicked()
{
    loginSet *L = new loginSet(this->mysql.SERVER,this->mysql.PORT,this); // 指定父对象
    L->show();
}

// 卡丁车添加
void admin::on_kdcInsert_clicked()
{
    // 创建并配置模型
    kdcModel->setTable("kdc_info"); // 绑定到你的表名
    kdcModel->setEditStrategy(QSqlTableModel::OnManualSubmit);

    // 设置字段显示名称（与实际字段名无关，仅UI显示）
    kdcModel->setHeaderData(kdcModel->fieldIndex("kdc_color"), Qt::Horizontal, "车辆颜色");
    kdcModel->setHeaderData(kdcModel->fieldIndex("kdc_type"), Qt::Horizontal, "车辆类型");
    kdcModel->setHeaderData(kdcModel->fieldIndex("kdc_booking"), Qt::Horizontal, "使用状况");
    kdcModel->setHeaderData(kdcModel->fieldIndex("kdc_state"), Qt::Horizontal, "车辆状态");
    kdcModel->setHeaderData(kdcModel->fieldIndex("kdc_id"), Qt::Horizontal, "车辆编号");
    kdcModel->setHeaderData(kdcModel->fieldIndex("kdc_exclusive"), Qt::Horizontal, "是否专属");

    int idColumn = kdcModel->fieldIndex("kdc_id"); // 获取 kdc_id 的列索引
    ui->kdcTableView->setColumnHidden(idColumn, true); // 屏蔽索引

    // 加载数据
    if (!kdcModel->select()) {
        QMessageBox::critical(this, "错误", "数据加载失败: " + kdcModel->lastError().text());
    }

    // 配置视图
    ui->kdcTableView->setModel(kdcModel);
    ui->kdcTableView->setEditTriggers(QAbstractItemView::DoubleClicked | QAbstractItemView::EditKeyPressed);

    // 插入新行
    int newRow = kdcModel->rowCount();
    if (!kdcModel->insertRow(newRow)) {
        QMessageBox::critical(this, "错误", "插入行失败: " + kdcModel->lastError().text());
        return;
    }

    // 在模型初始化后添加（如构造函数中）
    connect(kdcModel, &QSqlTableModel::beforeInsert,
            this, [](QSqlRecord &record) {
                // 标记 kdc_id 字段由数据库自动生成
                record.setGenerated("kdc_id", false);
            });



    // 设置非空字段默认值（根据你的表结构需求）
    QModelIndex colorIndex = kdcModel->index(newRow, kdcModel->fieldIndex("kdc_color"));
    kdcModel->setData(colorIndex, ""); // 默认颜色

    QModelIndex idIndex = kdcModel->index(newRow, kdcModel->fieldIndex("kdc_state"));
    kdcModel->setData(idIndex, "完好");

    QModelIndex stateIndex = kdcModel->index(newRow, kdcModel->fieldIndex("kdc_state"));
    kdcModel->setData(stateIndex, "完好"); // 默认车辆状态

    QModelIndex bookingIndex = kdcModel->index(newRow, kdcModel->fieldIndex("kdc_booking"));
    kdcModel->setData(bookingIndex, "空闲"); // 默认预约状态

    // 自动聚焦到首列
    ui->kdcTableView->scrollToBottom();
    ui->kdcTableView->setCurrentIndex(colorIndex);
    ui->kdcTableView->edit(colorIndex);
}

// 卡丁车子页面确认按键
void admin::on_kdcYes_clicked()
{

    if(flag)
    {
        // 获取选中的行（支持多选）
        QModelIndexList selectedRows = ui->kdcTableView->selectionModel()->selectedRows();

        if (selectedRows.isEmpty()) {
            QMessageBox::information(this, "提示", "请先选择要删除的行");
            return;
        }

        // 按倒序删除避免索引错位
        std::sort(selectedRows.begin(), selectedRows.end(), [](const QModelIndex &a, const QModelIndex &b) {
            return a.row() > b.row();
        });

        // 开启事务
        kdcModel->database().transaction();

        foreach (const QModelIndex &index, selectedRows) {
            kdcModel->removeRow(index.row());
        }

        // 提交更改到数据库
        if (kdcModel->submitAll()) {
            kdcModel->database().commit();
            kdcModel->select(); // 刷新模型数据
        } else {
            kdcModel->database().rollback();
            QMessageBox::critical(this, "错误", "删除失败: " + kdcModel->lastError().text());
        }
        flag = false;
        return;
    }




    // 验证数据长度
    for (int row = 0; row < kdcModel->rowCount(); ++row) {
        QVector<QString> fields = {"kdc_color", "kdc_type", "kdc_booking", "kdc_state", "kdc_exclusive"};
        foreach (const QString &field, fields) {
            QModelIndex idx = kdcModel->index(row, kdcModel->fieldIndex(field));
            QString val = kdcModel->data(idx).toString();
            if (val.length() > 20) { // 根据你的varchar(20)限制
                QMessageBox::warning(this, "警告", QString("%1 长度不能超过20字符").arg(field));
                return;
            }
        }
    }

    // 提交事务
    mysql.db.transaction();
    if (kdcModel->submitAll()) {
        mysql.db.commit();
        kdcModel->select(); // 刷新数据
        QMessageBox::information(this, "成功", "提交成功！");
    } else {
        mysql.db.rollback();
        QSqlError err = kdcModel->lastError();
        QString errorMsg = QString("驱动错误：%1\n数据库错误：%2").arg(err.driverText()).arg(err.databaseText());
        QMessageBox::critical(this, "提交失败", errorMsg);
    }

    // 禁用后续编辑（可选）
    ui->kdcTableView->setEditTriggers(QAbstractItemView::NoEditTriggers);
    int idColumn = kdcModel->fieldIndex("kdc_id"); // 获取 kdc_id 的列索引
    ui->kdcTableView->setColumnHidden(idColumn, false); // 取消屏蔽索引
}

// 卡丁车修改
void admin::on_kdcUpdate_clicked()
{
    // 创建并配置模型
    kdcModel->setTable("kdc_info"); // 绑定到你的表名
    kdcModel->setEditStrategy(QSqlTableModel::OnManualSubmit);

    // 设置字段显示名称（与实际字段名无关，仅UI显示）
    kdcModel->setHeaderData(kdcModel->fieldIndex("kdc_color"), Qt::Horizontal, "车辆颜色");
    kdcModel->setHeaderData(kdcModel->fieldIndex("kdc_type"), Qt::Horizontal, "车辆类型");
    kdcModel->setHeaderData(kdcModel->fieldIndex("kdc_booking"), Qt::Horizontal, "使用状况");
    kdcModel->setHeaderData(kdcModel->fieldIndex("kdc_state"), Qt::Horizontal, "车辆状态");
    kdcModel->setHeaderData(kdcModel->fieldIndex("kdc_id"), Qt::Horizontal, "车辆编号");
    kdcModel->setHeaderData(kdcModel->fieldIndex("kdc_exclusive"), Qt::Horizontal, "是否专属");

    int idColumn = kdcModel->fieldIndex("kdc_id"); // 获取 kdc_id 的列索引
    ui->kdcTableView->setColumnHidden(idColumn, true); // 屏蔽索引

    // 加载数据
    if (!kdcModel->select()) {
        QMessageBox::critical(this, "错误", "数据加载失败: " + kdcModel->lastError().text());
    }

    // 配置视图
    ui->kdcTableView->setModel(kdcModel);
    ui->kdcTableView->setEditTriggers(QAbstractItemView::DoubleClicked | QAbstractItemView::EditKeyPressed);

    // 自动聚焦到首列
    ui->kdcTableView->scrollToBottom();

}

// 卡丁车删除
void admin::on_kdcDelete_clicked()
{
    kdcModel->setTable("kdc_info"); // 必须与数据库表名完全一致
    kdcModel->setEditStrategy(QSqlTableModel::OnManualSubmit); // 手动提交策略[2](@ref)

    // 设置字段显示名称（与实际字段名无关，仅UI显示）
    kdcModel->setHeaderData(kdcModel->fieldIndex("kdc_color"), Qt::Horizontal, "车辆颜色");
    kdcModel->setHeaderData(kdcModel->fieldIndex("kdc_type"), Qt::Horizontal, "车辆类型");
    kdcModel->setHeaderData(kdcModel->fieldIndex("kdc_booking"), Qt::Horizontal, "使用状况");
    kdcModel->setHeaderData(kdcModel->fieldIndex("kdc_state"), Qt::Horizontal, "车辆状态");
    kdcModel->setHeaderData(kdcModel->fieldIndex("kdc_id"), Qt::Horizontal, "车辆编号");
    kdcModel->setHeaderData(kdcModel->fieldIndex("kdc_exclusive"), Qt::Horizontal, "是否专属");

    if(!kdcModel->select()) { // 必须显式加载数据[2](@ref)
        QMessageBox::critical(nullptr, "错误", "数据加载失败: " + kdcModel->lastError().text());
        return;
    }

    ui->kdcTableView->setModel(kdcModel);
    ui->kdcTableView->setSelectionMode(QAbstractItemView::ExtendedSelection); // 支持多选[4](@ref)
    ui->kdcTableView->setSelectionBehavior(QAbstractItemView::SelectRows);

    flag = true;
}

// 用户添加
void admin::on_userInsert_clicked()
{
    // 创建并配置模型
    userModel->setTable("user"); // 绑定到你的表名
    userModel->setEditStrategy(QSqlTableModel::OnManualSubmit);

    // 设置字段显示名称（与实际字段名无关，仅UI显示）
    userModel->setHeaderData(userModel->fieldIndex("uname"), Qt::Horizontal, "用户名");
    userModel->setHeaderData(userModel->fieldIndex("upwd"), Qt::Horizontal, "密码");
    userModel->setHeaderData(userModel->fieldIndex("perm"), Qt::Horizontal, "2用户\n3维修");

    // 加载数据
    if (!userModel->select()) {
        QMessageBox::critical(this, "错误", "数据加载失败: " + userModel->lastError().text());
    }

    // 配置视图
    ui->userTableView->setModel(userModel);
    ui->userTableView->setEditTriggers(QAbstractItemView::DoubleClicked | QAbstractItemView::EditKeyPressed);

    // 插入新行
    int newRow = userModel->rowCount();
    if (!userModel->insertRow(newRow)) {
        QMessageBox::critical(this, "错误", "插入行失败: " + userModel->lastError().text());
        return;
    }

    // 在模型初始化后添加（如构造函数中）
    connect(userModel, &QSqlTableModel::beforeInsert,
            this, [](QSqlRecord &record) {
                // 标记 kdc_id 字段由数据库自动生成
                record.setGenerated("kdc_id", false);
            });



    // 设置非空字段默认值（根据你的表结构需求）
    QModelIndex colorIndex = userModel->index(newRow, userModel->fieldIndex("uname"));
    userModel->setData(colorIndex, ""); // 默认颜色

    QModelIndex idIndex = userModel->index(newRow, userModel->fieldIndex("upwd"));
    userModel->setData(idIndex, "111");

    QModelIndex stateIndex = userModel->index(newRow, userModel->fieldIndex("perm"));
    userModel->setData(stateIndex, "2"); // 默认车辆状态

    // 自动聚焦到首列
    ui->userTableView->scrollToBottom();
    ui->userTableView->setCurrentIndex(colorIndex);
    ui->userTableView->edit(colorIndex);
}

// 用户子页面确认按钮
void admin::on_userYes_clicked()
{
    if(flag)
    {
        // 获取选中的行（支持多选）
        QModelIndexList selectedRows = ui->userTableView->selectionModel()->selectedRows();

        if (selectedRows.isEmpty()) {
            QMessageBox::information(this, "提示", "请先选择要删除的行");
            return;
        }

        // 按倒序删除避免索引错位
        std::sort(selectedRows.begin(), selectedRows.end(), [](const QModelIndex &a, const QModelIndex &b) {
            return a.row() > b.row();
        });

        // 开启事务
        userModel->database().transaction();

        foreach (const QModelIndex &index, selectedRows) {
            userModel->removeRow(index.row());
        }

        // 提交更改到数据库
        if (userModel->submitAll()) {
            userModel->database().commit();
            userModel->select(); // 刷新模型数据
        } else {
            userModel->database().rollback();
            QMessageBox::critical(this, "错误", "删除失败: " + userModel->lastError().text());
        }
        flag = false;
        return;
    }

    // 验证数据长度
    for (int row = 0; row < userModel->rowCount(); ++row) {
        QVector<QString> fields = {"uname", "upwd", "perm"};
        foreach (const QString &field, fields) {
            QModelIndex idx = userModel->index(row, userModel->fieldIndex(field));
            QString val = userModel->data(idx).toString();
            if (val.length() > 20) { // 根据你的varchar(20)限制
                QMessageBox::warning(this, "警告", QString("%1 长度不能超过20字符").arg(field));
                return;
            }
        }
    }

    // 提交事务
    mysql.db.transaction();
    if (userModel->submitAll()) {
        mysql.db.commit();
        userModel->select(); // 刷新数据
        QMessageBox::information(this, "成功", "提交成功！");
    } else {
        mysql.db.rollback();
        QSqlError err = userModel->lastError();
        QString errorMsg = QString("驱动错误：%1\n数据库错误：%2").arg(err.driverText()).arg(err.databaseText());
        QMessageBox::critical(this, "提交失败", errorMsg);
    }

    // 禁用后续编辑（可选）
    ui->userTableView->setEditTriggers(QAbstractItemView::NoEditTriggers);
}

// 用户修改
void admin::on_userUpdate_clicked()
{
    // 创建并配置模型
    userModel->setTable("user"); // 绑定到你的表名
    userModel->setEditStrategy(QSqlTableModel::OnManualSubmit);

    // 设置字段显示名称（与实际字段名无关，仅UI显示）
    userModel->setHeaderData(userModel->fieldIndex("uname"), Qt::Horizontal, "用户名");
    userModel->setHeaderData(userModel->fieldIndex("upwd"), Qt::Horizontal, "密码");
    userModel->setHeaderData(userModel->fieldIndex("perm"), Qt::Horizontal, "2用户\n3维修");

    int idColumn = userModel->fieldIndex("kdc_id"); // 获取 kdc_id 的列索引
    ui->userTableView->setColumnHidden(idColumn, true); // 屏蔽索引

    // 加载数据
    if (!userModel->select()) {
        QMessageBox::critical(this, "错误", "数据加载失败: " + userModel->lastError().text());
    }

    // 配置视图
    ui->userTableView->setModel(userModel);
    ui->userTableView->setEditTriggers(QAbstractItemView::DoubleClicked | QAbstractItemView::EditKeyPressed);

    // 自动聚焦到首列
    ui->userTableView->scrollToBottom();

}

// 用户删除
void admin::on_userDelete_clicked()
{
    // 创建并配置模型
    userModel->setTable("user"); // 绑定到你的表名
    userModel->setEditStrategy(QSqlTableModel::OnManualSubmit);

    // 设置字段显示名称（与实际字段名无关，仅UI显示）
    userModel->setHeaderData(userModel->fieldIndex("uname"), Qt::Horizontal, "用户名");
    userModel->setHeaderData(userModel->fieldIndex("upwd"), Qt::Horizontal, "密码");
    userModel->setHeaderData(userModel->fieldIndex("perm"), Qt::Horizontal, "2用户\n3维修");

    if(!userModel->select()) { // 必须显式加载数据[2](@ref)
        QMessageBox::critical(nullptr, "错误", "数据加载失败: " + userModel->lastError().text());
        return;
    }

    ui->userTableView->setModel(userModel);
    ui->userTableView->setSelectionMode(QAbstractItemView::ExtendedSelection); // 支持多选[4](@ref)
    ui->userTableView->setSelectionBehavior(QAbstractItemView::SelectRows);

    flag = true;

}

// 会员添加
void admin::on_memberInsert_clicked()
{
    // 创建并配置模型
    memberModel->setTable("user"); // 绑定到你的表名
    memberModel->setEditStrategy(QSqlTableModel::OnManualSubmit);

    // 设置筛选条件，只显示 perm = 2 的数据
    maintainModel->setFilter("perm = 2");

    // 设置字段显示名称（与实际字段名无关，仅UI显示）
    memberModel->setHeaderData(memberModel->fieldIndex("uname"), Qt::Horizontal, "用户名");
    memberModel->setHeaderData(memberModel->fieldIndex("upwd"), Qt::Horizontal, "密码");
    int idColumn = memberModel->fieldIndex("perm"); // 获取 perm 的列索引
    ui->memberTableView->setColumnHidden(idColumn, true); // 屏蔽索引

    // 加载数据
    if (!memberModel->select()) {
        QMessageBox::critical(this, "错误", "数据加载失败: " + memberModel->lastError().text());
    }

    // 配置视图
    ui->memberTableView->setModel(memberModel);
    ui->memberTableView->setEditTriggers(QAbstractItemView::DoubleClicked | QAbstractItemView::EditKeyPressed);

    // 插入新行
    int newRow = memberModel->rowCount();
    if (!memberModel->insertRow(newRow)) {
        QMessageBox::critical(this, "错误", "插入行失败: " + memberModel->lastError().text());
        return;
    }

    // 设置非空字段默认值（根据你的表结构需求）
    QModelIndex colorIndex = memberModel->index(newRow, memberModel->fieldIndex("uname"));
    memberModel->setData(colorIndex, "");

    QModelIndex idIndex = memberModel->index(newRow, memberModel->fieldIndex("upwd"));
    memberModel->setData(idIndex, "111"); //默认密码

    QModelIndex stateIndex = memberModel->index(newRow, memberModel->fieldIndex("perm"));
    memberModel->setData(stateIndex, "2"); // 默认权限

    // 自动聚焦到首列
    ui->memberTableView->scrollToBottom();
    ui->memberTableView->setCurrentIndex(colorIndex);
    ui->memberTableView->edit(colorIndex);
}

// 会员删除
void admin::on_memberDelete_clicked()
{
    // 创建并配置模型
    memberModel->setTable("user"); // 绑定到你的表名
    memberModel->setEditStrategy(QSqlTableModel::OnManualSubmit);

    // 设置筛选条件，只显示 perm = 2 的数据
    maintainModel->setFilter("perm = 2");

    // 设置字段显示名称（与实际字段名无关，仅UI显示）
    memberModel->setHeaderData(memberModel->fieldIndex("uname"), Qt::Horizontal, "用户名");
    memberModel->setHeaderData(memberModel->fieldIndex("upwd"), Qt::Horizontal, "密码");
    memberModel->setHeaderData(memberModel->fieldIndex("perm"), Qt::Horizontal, "2用户");

    if(!memberModel->select()) { // 必须显式加载数据[2](@ref)
        QMessageBox::critical(nullptr, "错误", "数据加载失败: " + memberModel->lastError().text());
        return;
    }

    ui->memberTableView->setModel(memberModel);
    ui->memberTableView->setSelectionMode(QAbstractItemView::ExtendedSelection); // 支持多选[4](@ref)
    ui->memberTableView->setSelectionBehavior(QAbstractItemView::SelectRows);

    flag = true;

}

// 会员修改
void admin::on_memberUpdate_clicked()
{
    // 创建并配置模型
    memberModel->setTable("member_info"); // 绑定到你的表名
    memberModel->setEditStrategy(QSqlTableModel::OnManualSubmit);

    // 设置字段显示名称（与实际字段名无关，仅UI显示）
    memberModel->setHeaderData(memberModel->fieldIndex("client_name"), Qt::Horizontal, "用户名");
    memberModel->setHeaderData(memberModel->fieldIndex("client_contact"), Qt::Horizontal, "联系方式");
    memberModel->setHeaderData(memberModel->fieldIndex("client_booking"), Qt::Horizontal, "预约的编号");
    memberModel->setHeaderData(memberModel->fieldIndex("client_grade"), Qt::Horizontal, "会员等级");
    memberModel->setHeaderData(memberModel->fieldIndex("client_balance"), Qt::Horizontal, "余额信息");

    // 加载数据
    if (!memberModel->select()) {
        QMessageBox::critical(this, "错误", "数据加载失败: " + memberModel->lastError().text());
    }

    // 配置视图
    ui->memberTableView->setModel(memberModel);
    ui->memberTableView->setEditTriggers(QAbstractItemView::DoubleClicked | QAbstractItemView::EditKeyPressed);

    // 自动聚焦到首列
    ui->memberTableView->scrollToBottom();
}

// 会员子页面确认按钮
void admin::on_memberYes_clicked()
{
    if(flag)
    {
        // 获取选中的行（支持多选）
        QModelIndexList selectedRows = ui->memberTableView->selectionModel()->selectedRows();

        if (selectedRows.isEmpty()) {
            QMessageBox::information(this, "提示", "请先选择要删除的行");
            return;
        }

        // 按倒序删除避免索引错位
        std::sort(selectedRows.begin(), selectedRows.end(), [](const QModelIndex &a, const QModelIndex &b) {
            return a.row() > b.row();
        });

        // 开启事务
        memberModel->database().transaction();

        foreach (const QModelIndex &index, selectedRows) {
            memberModel->removeRow(index.row());
        }

        // 提交更改到数据库
        if (memberModel->submitAll()) {
            memberModel->database().commit();
            memberModel->select(); // 刷新模型数据
        } else {
            memberModel->database().rollback();
            QMessageBox::critical(this, "错误", "删除失败: " + memberModel->lastError().text());
        }
        flag = false;
        return;
    }

    // 验证数据长度
    for (int row = 0; row < memberModel->rowCount(); ++row) {
        QVector<QString> fields = {"uname", "upwd", "perm"};
        foreach (const QString &field, fields) {
            QModelIndex idx = memberModel->index(row, memberModel->fieldIndex(field));
            QString val = memberModel->data(idx).toString();
            if (val.length() > 20) { // 根据你的varchar(20)限制
                QMessageBox::warning(this, "警告", QString("%1 长度不能超过20字符").arg(field));
                return;
            }
        }
    }

    // 提交事务
    mysql.db.transaction();
    if (memberModel->submitAll()) {
        mysql.db.commit();
        memberModel->select(); // 刷新数据
        QMessageBox::information(this, "成功", "提交成功！");
    } else {
        mysql.db.rollback();
        QSqlError err = memberModel->lastError();
        QString errorMsg = QString("驱动错误：%1\n数据库错误：%2").arg(err.driverText()).arg(err.databaseText());
        QMessageBox::critical(this, "提交失败", errorMsg);
    }


    QSqlQuery query(mysql.db);
    query.prepare(
        "INSERT INTO member_info (client_name) "
        "SELECT u.uname FROM user u "
        "WHERE u.perm = 2 "
        "AND NOT EXISTS ("
        "   SELECT 1 FROM member_info m WHERE m.client_name = u.uname"
        ")"
        );

    if (!query.exec()) {
        QMessageBox::critical(this, "错误", "批量插入失败: " + query.lastError().text());
        return;
    }

    QMessageBox::information(this, "成功", "操作完成，影响行数: " + QString::number(query.numRowsAffected()));


    // 禁用后续编辑（可选）
    ui->memberTableView->setEditTriggers(QAbstractItemView::NoEditTriggers);
    int idColumn = memberModel->fieldIndex("perm"); // 获取 perm 的列索引
    ui->memberTableView->setColumnHidden(idColumn, false); // 取消屏蔽索引
}

// 维修员添加
void admin::on_maintainInsert_clicked()
{
    // 创建并配置模型
    maintainModel->setTable("user"); // 绑定到你的表名
    maintainModel->setEditStrategy(QSqlTableModel::OnManualSubmit);

    // 设置筛选条件，只显示 perm = 3 的数据
    maintainModel->setFilter("perm = 3");

    // 设置字段显示名称（与实际字段名无关，仅UI显示）
    maintainModel->setHeaderData(maintainModel->fieldIndex("uname"), Qt::Horizontal, "用户名");
    maintainModel->setHeaderData(maintainModel->fieldIndex("upwd"), Qt::Horizontal, "密码");
    int idColumn = maintainModel->fieldIndex("perm"); // 获取 perm 的列索引
    ui->maintainTableView->setColumnHidden(idColumn, true); // 屏蔽索引

    // 加载数据
    if (!maintainModel->select()) {
        QMessageBox::critical(this, "错误", "数据加载失败: " + maintainModel->lastError().text());
    }

    // 配置视图
    ui->maintainTableView->setModel(maintainModel);
    ui->maintainTableView->setEditTriggers(QAbstractItemView::DoubleClicked | QAbstractItemView::EditKeyPressed);

    // 插入新行
    int newRow = maintainModel->rowCount();
    if (!maintainModel->insertRow(newRow)) {
        QMessageBox::critical(this, "错误", "插入行失败: " + maintainModel->lastError().text());
        return;
    }

    // 设置非空字段默认值（根据你的表结构需求）
    QModelIndex colorIndex = maintainModel->index(newRow, maintainModel->fieldIndex("uname"));
    maintainModel->setData(colorIndex, "");

    QModelIndex idIndex = maintainModel->index(newRow, maintainModel->fieldIndex("upwd"));
    maintainModel->setData(idIndex, "333"); //默认密码

    QModelIndex stateIndex = maintainModel->index(newRow, maintainModel->fieldIndex("perm"));
    maintainModel->setData(stateIndex, "3"); // 默认权限

    // 自动聚焦到首列
    ui->maintainTableView->scrollToBottom();
    ui->maintainTableView->setCurrentIndex(colorIndex);
    ui->maintainTableView->edit(colorIndex);
}

// 维修员删除
void admin::on_maintainDelete_clicked()
{
    // 创建并配置模型
    maintainModel->setTable("user"); // 绑定到你的表名
    maintainModel->setEditStrategy(QSqlTableModel::OnManualSubmit);

    // 设置筛选条件，只显示 perm = 3 的数据
    maintainModel->setFilter("perm = 3");

    // 设置字段显示名称（与实际字段名无关，仅UI显示）
    maintainModel->setHeaderData(maintainModel->fieldIndex("uname"), Qt::Horizontal, "用户名");
    maintainModel->setHeaderData(maintainModel->fieldIndex("upwd"), Qt::Horizontal, "密码");
    maintainModel->setHeaderData(maintainModel->fieldIndex("perm"), Qt::Horizontal, "3维修员");

    if(!maintainModel->select()) { // 必须显式加载数据[2](@ref)
        QMessageBox::critical(nullptr, "错误", "数据加载失败: " + maintainModel->lastError().text());
        return;
    }

    ui->maintainTableView->setModel(maintainModel);
    ui->maintainTableView->setSelectionMode(QAbstractItemView::ExtendedSelection); // 支持多选[4](@ref)
    ui->maintainTableView->setSelectionBehavior(QAbstractItemView::SelectRows);

    flag = true;
}

// 维修员修改
void admin::on_maintainUpdate_clicked()
{
    flag = false;
    // 创建并配置模型
    maintainModel->setTable("maintain_info"); // 绑定到你的表名
    maintainModel->setEditStrategy(QSqlTableModel::OnManualSubmit);


    // 设置字段显示名称（与实际字段名无关，仅UI显示）
    maintainModel->setHeaderData(maintainModel->fieldIndex("maintain_name"), Qt::Horizontal, "用户名");
    maintainModel->setHeaderData(maintainModel->fieldIndex("maintain_contact"), Qt::Horizontal, "联系方式");
    maintainModel->setHeaderData(maintainModel->fieldIndex("maintaint_num"), Qt::Horizontal, "任务数量");

    // 加载数据
    if (!maintainModel->select()) {
        QMessageBox::critical(this, "错误", "数据加载失败: " + maintainModel->lastError().text());
    }

    // 配置视图
    ui->maintainTableView->setModel(maintainModel);
    ui->maintainTableView->setEditTriggers(QAbstractItemView::DoubleClicked | QAbstractItemView::EditKeyPressed);

    // 自动聚焦到首列
    ui->maintainTableView->scrollToBottom();
}

// 维修员子页面的确认按钮
void admin::on_maintainYes_clicked()
{
    if(flag)
    {
        // 获取选中的行（支持多选）
        QModelIndexList selectedRows = ui->maintainTableView->selectionModel()->selectedRows();

        if (selectedRows.isEmpty()) {
            QMessageBox::information(this, "提示", "请先选择要删除的行");
            flag = false;
            return;
        }

        // 按倒序删除避免索引错位
        std::sort(selectedRows.begin(), selectedRows.end(), [](const QModelIndex &a, const QModelIndex &b) {
            flag = false;
            return a.row() > b.row();
        });

        // 开启事务
        maintainModel->database().transaction();

        foreach (const QModelIndex &index, selectedRows) {
            maintainModel->removeRow(index.row());
        }

        // 提交更改到数据库
        if (maintainModel->submitAll()) {
            maintainModel->database().commit();
            maintainModel->select(); // 刷新模型数据
        } else {
            maintainModel->database().rollback();
            QMessageBox::critical(this, "错误", "删除失败: " + maintainModel->lastError().text());
        }
        flag = false;
        return;
    }

    // 验证数据长度
    for (int row = 0; row < maintainModel->rowCount(); ++row) {
        QVector<QString> fields = {"uname", "upwd", "perm"};
        foreach (const QString &field, fields) {
            QModelIndex idx = maintainModel->index(row, maintainModel->fieldIndex(field));
            QString val = maintainModel->data(idx).toString();
            if (val.length() > 20) { // 根据你的varchar(20)限制
                QMessageBox::warning(this, "警告", QString("%1 长度不能超过20字符").arg(field));
                return;
            }
        }
    }

    // 提交事务
    mysql.db.transaction();
    if (maintainModel->submitAll()) {
        mysql.db.commit();
        maintainModel->select(); // 刷新数据
        QMessageBox::information(this, "成功", "提交成功！");
    } else {
        mysql.db.rollback();
        QSqlError err = maintainModel->lastError();
        QString errorMsg = QString("驱动错误：%1\n数据库错误：%2").arg(err.driverText()).arg(err.databaseText());
        QMessageBox::critical(this, "提交失败", errorMsg);
    }


    QSqlQuery query(mysql.db);
    query.prepare(
        "INSERT INTO maintain_info (maintain_name) "
        "SELECT u.uname FROM user u "
        "WHERE u.perm = 3 "
        "AND NOT EXISTS ("
        "   SELECT 1 FROM maintain_info m WHERE m.maintain_name = u.uname"
        ")"
        );

    if (!query.exec()) {
        QMessageBox::critical(this, "错误", "批量插入失败: " + query.lastError().text());
        return;
    }

    QMessageBox::information(this, "成功", "操作完成，影响行数: " + QString::number(query.numRowsAffected()));


    // 禁用后续编辑（可选）
    ui->maintainTableView->setEditTriggers(QAbstractItemView::NoEditTriggers);
    int idColumn = maintainModel->fieldIndex("perm"); // 获取 perm 的列索引
    ui->maintainTableView->setColumnHidden(idColumn, false); // 取消屏蔽索引
}

